part of "basic.dart";

/// 我自定义的一种缓存，无论用什么方法实现，都需要符合一致的行为逻辑
/// 比如说，在一开始确保已经初始化
/// 它整体的表现和Map是类似的
abstract class Cache {
  /// 初始化函数，自行在某地方调用
  /// 全局只能调用一次，不能调用多次（包括测试也是一样，整个测试文件中只能调用一次）
  Future<void> initOnce();

  /// 通常读取出来有原始值、RawList、RawMap等
  /// 如果key不存在，则会读取
  T? read<T>(String key);

  /// 目标是任何东西都可以保存，参考[stringify]理念
  void write(String key, dynamic value);

  /// 删除某一个key
  void remove(String key);

  /// 清除所有存在的key
  void clear();

  factory Cache.getStorage() => _GetStorage();
}

class _GetStorage implements Cache {
  bool inited = false;

  @override
  Future<void> initOnce() async {
    if (inited) throw BugDev("缓存已经初始化，请勿重复调用");
    await GetStorage.init();
    inited = true;
  }

  void _mustInit() {
    if (!inited) throw BugDev("缓存未初始化，无法使用");
  }

  @override
  T? read<T>(String key) {
    _mustInit();
    return GetStorage().read<T>(key);
  }

  @override
  void write(String key, value) {
    _mustInit();
    GetStorage().write(key, jsonfy(value));
  }

  @override
  void clear() {
    _mustInit();
    GetStorage().erase();
  }

  @override
  void remove(String key) {
    _mustInit();
    GetStorage().remove(key);
  }
}

final Cache cache = Cache.getStorage();
